package cn.frontop.funswitch.util;


import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;


/**
 * JAVA SCRIPT 执行工具
 *
 * @author Yun
 */
@Slf4j
public class JavaScriptUtil {


    private static final String JS_ENGINE_NAME = "JavaScript";
    private final static ScriptEngineManager SEM = new ScriptEngineManager();
    private final static ScriptEngine ENGINE = SEM.getEngineByName(JS_ENGINE_NAME);


    /**
     * 执行js代码进行 数据处理
     *
     * @param function 方法
     * @param source   源数据
     * @param params   参数
     * @return 处理结果
     */
    public static Object execution(String function, String source, String params) {
        try {
            ENGINE.eval(function);
            // 执行js函数
            Invocable jsInvoke = (Invocable) ENGINE;
            Object dataCleaning = jsInvoke.invokeFunction("dataCleaning", source, params);
            //方法的名字，参数
            return JSONUtil.isTypeJSON(dataCleaning.toString()) ? JSONUtil.parse(dataCleaning.toString()) : dataCleaning;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 执行js代码进行 数据处理
     *
     * @param function 方法
     * @param params   参数
     * @return 处理结果
     */
    public static Object execution(String function, Object params) {
        try {
            ENGINE.eval(function);
            // 执行js函数
            Invocable jsInvoke = (Invocable) ENGINE;
            Object dataCleaning = jsInvoke.invokeFunction("method", params);
            //方法的名字，参数
            return JSONUtil.isTypeJSON(dataCleaning.toString()) ? JSONUtil.parse(dataCleaning.toString()) : dataCleaning;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
